/*
 * Server.h
 *
 *  Created on: 29/05/2011
 *      Author: dela
 */

#ifndef SERVER_H_
#define SERVER_H_

#include <map>
#include <fstream>
#include <string>
#include "Accepter.h"
#include "InstructorConnection.h"
#include "StudentConnection.h"
#include "common/Class.h"
#include "common/Course.h"
#include "common/User.h"

class Server {
private:
	static Server *server;  //Instancia del singleton.

	// Aceptadores de conecciones:
	Accepter<InstructorConnection> instructorAccepter;
	Accepter<StudentConnection> studentAccepter;

	// hash de clases y cursos existentes en el servidor:
	// Id - puntero a entidad.
	std::map<unsigned int, Course*> courses;
	std::map<unsigned int, Class*> classes;

	/**
	 * Constructor privado por singleton.
	 */
	Server(int portInstructor, int portStudent) :
			instructorAccepter(portInstructor),
			studentAccepter(portStudent) {};

	void getNextString(std::ifstream &input, std::string &s);
public:
	/**
	 * Crea el Singleton.
	 */
	static void createSingleton(int portInstructor, int portStudent){
		server = new Server(portInstructor, portStudent);
	};

	/**
	 * Inicia los hilos que aceptan conecciones.
	 */
	void acceptConnections();

	/**
	 * Hace el join de todos los hilos.
	 */
	void serverShutdown();

	/**
	 * Devuelve el singleton.
	 */
	static Server *getInstance() {return server;};

	/**
	 * Busca el usuario en el archivo de usuarios y lo devuelve.
	 * Retorna true si lo encuentra, false en caso contrario.
	 */
	bool getUser(std::string userName, User &user);

	std::map<unsigned int, Course*> &getCourses() {return courses;};
	std::map<unsigned int, Class*> &getClasses() {return classes;};
};

#endif /* SERVER_H_ */
